#include <stdio.h>
#include <errno.h>
#include <sys/select.h>

// sleep in millisecond(ms, 1 s = 1000 ms).
int msleep(unsigned int ms)
{
    int ret;
    struct timeval tval;
    tval.tv_sec  =  ms/1000;
    tval.tv_usec = (ms*1000)%1000000;
    while(1)
    {
        ret = select(0,NULL,NULL,NULL,&tval);
        // 阻塞的sleep需要考虑潜在的信号打断风险
        if (ret < 0) {
            if (errno == EINTR) {
                // 由于ms开销比较小，对于被信号打断时，可以采用"重新开始"这种策略
                continue;
            }
            return ret;
        }
        break;
    }
    return 0;
}

#if 0
#include <stdlib.h>
#include <time.h>
#include <sys/time.h>
void printCurrentTime(void)
{
    struct timeval tv;
    static char timestring[200];
    time_t      now;
    struct tm*  tm_now;
    time(&now);
    tm_now = localtime(&now);
    /*
      %a  星期几的简写
      %A  星期几的全称
      %b  月分的简写
      %B  月份的全称
      %c  标准的日期的时间串
      %C  年份的后两位数字
      %d  十进制表示的每月的第几天
      %D  月/ 天/ 年
      %e  在两字符域中，十进制表示的每月的第几天
      %F  年- 月- 日
      %g  年份的后两位数字，使用基于周的年
      %G  年分，使用基于周的年
      %h  简写的月份名
      %H 24 小时制的小时
      %I 12 小时制的小时
      %j  十进制表示的每年的第几天
      %m  十进制表示的月份
      %M  十时制表示的分钟数
      %n  新行符
      %p  本地的AM 或PM 的等价显示
      %r 12 小时的时间
      %R  显示小时和分钟：hh:mm
      %S  十进制的秒数
      %t  水平制表符
      %T  显示时分秒：hh:mm:ss
      %u  每周的第几天，星期一为第一天  （值从0 到6 ，星期一为0 ）
      %U  第年的第几周，把星期日做为第一天（值从0 到53 ）
      %V  每年的第几周，使用基于周的年
      %w  十进制表示的星期几（值从0 到6 ，星期天为0 ）
      %x  标准的日期串
      %X  标准的时间串
      %y  不带世纪的十进制年份（值从0 到99 ）
      %Y  带世纪部分的十进制年份
      %z ，%Z  时区名称，如果不能得到时区名称则返回空字符。
      %%  百分号
  */
    //strftime(timestring, sizeof(timestring), "%Y-%m-%d %H:%M:%S", tm_now);
    strftime(timestring, sizeof(timestring), "%H:%M:%S", tm_now);
    gettimeofday(&tv,NULL);
    printf("%s.%07ld\n", timestring, tv.tv_usec);
}

int main(int argc, char * argv[])
{
    if(argv[1] != NULL)
    {
        printf("Test delay %s ms. (%f s)\n", argv[1], atoi(argv[1]) / 1000.0);
        printCurrentTime();
        msleep(atoi(argv[1]));
        printCurrentTime();
    }else
    {
        printf("Test delay 20 ms. (0.020 s)\n");
        printCurrentTime();
        msleep(20);
        printCurrentTime();
    }

    return 0;
}
#endif
